
CREATE SEQUENCE  "MODPRE"."SQ_CFG_AREA_CENTRAL"  MINVALUE 1 MAXVALUE 9999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE ;
CREATE SEQUENCE  "MODPRE"."SQ_CFG_FINANZA"  MINVALUE 1 MAXVALUE 9999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE ;
CREATE SEQUENCE  "MODPRE"."SQ_CFG_MEDIO_PAGO"  MINVALUE 1 MAXVALUE 9999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE ;
CREATE SEQUENCE  "MODPRE"."SQ_CFG_RIESGO"  MINVALUE 1 MAXVALUE 9999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE ;
CREATE SEQUENCE  "MODPRE"."SQ_CFG_SISTEMA"  MINVALUE 1 MAXVALUE 9999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE ;
CREATE SEQUENCE "MODPRE"."SQ_CFG_SPREAD_FIN" MINVALUE 1 MAXVALUE 9999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE ;

-- 
create or replace 
PACKAGE BODY PK_CARGA_ARCHIVO AS
PROCEDURE SP_POST_CARGA_TASA_COSTO_CON AS
BEGIN
  DECLARE
  L_CFG_EXCEPCION_DURACION_CF CFG_EXCEPCION_DURACION_CF%ROWTYPE;
  L_TASA    NUMBER(16,2);
  L_ASIGNAR_PLAZO NUMBER(16);
  BEGIN
    FOR X IN (
      SELECT * FROM CFG_FINANZA
    )LOOP
      BEGIN
        L_TASA:=0;
        SELECT asignar_plazo INTO L_ASIGNAR_PLAZO FROM CFG_EXCEPCION_DURACION_CF 
        WHERE codigo_producto = 1 
        and moneda = X.MONEDA_CON 
        and X.PLAZO_CON 
        between mayor_o_igual and menor_o_igual
        and rownum=1;
        IF(L_ASIGNAR_PLAZO is not NULL)THEN  
          IF(X.MONEDA_CON='USD')THEN
            select t.tasa_dolar_activa INTO L_TASA 
            from (select * from cfg_costo_fondeo where cantidad_dias_maximo>=L_ASIGNAR_PLAZO and estado=1
            order by cantidad_dias_maximo) t where rownum=1;
          ELSIF(X.MONEDA_CON='PEN')THEN 
            select t.tasa_nacional_activa INTO L_TASA 
            from (select * from cfg_costo_fondeo where cantidad_dias_maximo>=L_ASIGNAR_PLAZO and estado=1
            order by cantidad_dias_maximo) t where rownum=1;
          END IF;
        ELSIF(L_ASIGNAR_PLAZO is NULL)THEN
          IF(X.MONEDA_CON='USD')THEN
            select t.tasa_dolar_activa INTO L_TASA 
            from (select * from cfg_costo_fondeo where cantidad_dias_maximo>=X.PLAZO_CON and estado=1
            order by cantidad_dias_maximo) t where rownum=1;
          ELSIF(X.MONEDA_CON='PEN')THEN
            select t.tasa_nacional_activa INTO L_TASA 
            from (select * from cfg_costo_fondeo where cantidad_dias_maximo>=X.PLAZO_CON and estado=1
            order by cantidad_dias_maximo) t where rownum=1;
          END IF;
        END IF;
      EXCEPTION
      WHEN OTHERS THEN
        BEGIN
          IF(X.MONEDA_CON='USD')THEN
            select t.tasa_dolar_activa INTO L_TASA 
            from (select * from cfg_costo_fondeo where cantidad_dias_maximo>=X.PLAZO_CON and estado=1
            order by cantidad_dias_maximo) t where rownum=1;
          ELSIF(X.MONEDA_CON='PEN')THEN
            select t.tasa_nacional_activa INTO L_TASA 
            from (select * from cfg_costo_fondeo where cantidad_dias_maximo>=X.PLAZO_CON and estado=1
            order by cantidad_dias_maximo) t where rownum=1;
          END IF;
        EXCEPTION
        WHEN OTHERS THEN
          BEGIN
            IF(X.MONEDA_CON='USD')THEN
              select t.tasa_dolar_activa INTO L_TASA 
              from (select * from cfg_costo_fondeo where estado=1
              order by cantidad_dias_maximo desc) t where rownum=1;
            ELSIF(X.MONEDA_CON='PEN')THEN
              select t.tasa_nacional_activa INTO L_TASA 
              from (select * from cfg_costo_fondeo where estado=1
              order by cantidad_dias_maximo desc) t where rownum=1;
            END IF;
          EXCEPTION
          WHEN OTHERS THEN
            L_TASA:=0;
          END;
        END;
      END;
      UPDATE CFG_FINANZA SET TASA_COSTO_CON=L_TASA WHERE ID=X.ID;
      COMMIT;    
    END LOOP;
  END;
END;

PROCEDURE SP_POST_CARGA_TASA_COSTO_HIPO AS
BEGIN
  DECLARE
  L_CFG_EXCEPCION_DURACION_CF CFG_EXCEPCION_DURACION_CF%ROWTYPE;
  L_TASA    NUMBER(16,2);
  L_ASIGNAR_PLAZO NUMBER(16);
  BEGIN
    FOR X IN (
      SELECT * FROM CFG_FINANZA
    )LOOP
      BEGIN
        SELECT asignar_plazo INTO L_ASIGNAR_PLAZO FROM CFG_EXCEPCION_DURACION_CF 
        WHERE codigo_producto = 3 
        and moneda = X.MONEDA_HIPO 
        and X.PLAZO_HIPO 
        between mayor_o_igual and menor_o_igual
        and rownum=1;    
        IF(L_ASIGNAR_PLAZO is not NULL)THEN  
          IF(X.MONEDA_HIPO='USD')THEN
            select t.tasa_dolar_activa INTO L_TASA 
            from (select * from cfg_costo_fondeo where cantidad_dias_maximo>=L_ASIGNAR_PLAZO and estado=1
            order by cantidad_dias_maximo) t where rownum=1;
          ELSIF(X.MONEDA_HIPO='PEN')THEN 
            select t.tasa_nacional_activa INTO L_TASA 
            from (select * from cfg_costo_fondeo where cantidad_dias_maximo>=L_ASIGNAR_PLAZO and estado=1
            order by cantidad_dias_maximo) t where rownum=1;
          END IF;
        ELSIF(L_ASIGNAR_PLAZO is NULL)THEN
          IF(X.MONEDA_HIPO='USD')THEN
            select t.tasa_dolar_activa INTO L_TASA 
            from (select * from cfg_costo_fondeo where cantidad_dias_maximo>=X.PLAZO_HIPO and estado=1
            order by cantidad_dias_maximo) t where rownum=1;
          ELSIF(X.MONEDA_HIPO='PEN')THEN
            select t.tasa_nacional_activa INTO L_TASA 
            from (select * from cfg_costo_fondeo where cantidad_dias_maximo>=X.PLAZO_HIPO and estado=1
            order by cantidad_dias_maximo) t where rownum=1;
          END IF;
        END IF;
      EXCEPTION
      WHEN OTHERS THEN
        BEGIN
          IF(X.MONEDA_HIPO='USD')THEN
            select t.tasa_dolar_activa INTO L_TASA 
            from (select * from cfg_costo_fondeo where cantidad_dias_maximo>=X.PLAZO_HIPO and estado=1
            order by cantidad_dias_maximo) t where rownum=1;
          ELSIF(X.MONEDA_HIPO='PEN')THEN
            select t.tasa_nacional_activa INTO L_TASA 
            from (select * from cfg_costo_fondeo where cantidad_dias_maximo>=X.PLAZO_HIPO and estado=1
            order by cantidad_dias_maximo) t where rownum=1;
          END IF;
        EXCEPTION
        WHEN OTHERS THEN
          BEGIN
            IF(X.MONEDA_CON='USD')THEN
              select t.tasa_dolar_activa INTO L_TASA 
              from (select * from cfg_costo_fondeo where estado=1
              order by cantidad_dias_maximo desc) t where rownum=1;
            ELSIF(X.MONEDA_CON='PEN')THEN
              select t.tasa_nacional_activa INTO L_TASA 
              from (select * from cfg_costo_fondeo where estado=1
              order by cantidad_dias_maximo desc) t where rownum=1;
            END IF;
          EXCEPTION
          WHEN OTHERS THEN
            L_TASA:=0;
          END;
        END;
      END;
      UPDATE CFG_FINANZA SET TASA_COSTO_HIPO=L_TASA WHERE ID=X.ID;
      COMMIT;    
    END LOOP;
  END;
END;



PROCEDURE SP_POST_CARGA_SPREAD_TC AS
BEGIN
  DECLARE
  L_CFG_EXCEPCION_DURACION_CF CFG_EXCEPCION_DURACION_CF%ROWTYPE;
  L_TASA    NUMBER(16,2);
  L_ASIGNAR_PLAZO NUMBER(16);
  BEGIN
    FOR X IN (
      SELECT * FROM CFG_FINANZA
    )LOOP
      BEGIN
        SELECT asignar_plazo INTO L_ASIGNAR_PLAZO FROM CFG_EXCEPCION_DURACION_CF 
        WHERE moneda = 'PEN'
        and 90
        between mayor_o_igual and menor_o_igual
        and rownum=1;    
        IF(L_ASIGNAR_PLAZO is not NULL)THEN  
            select NVL(t.tasa_nacional_activa,0) INTO L_TASA 
            from (select * from cfg_costo_fondeo where cantidad_dias_maximo>=L_ASIGNAR_PLAZO and estado=1
            order by cantidad_dias_maximo) t where rownum=1;
        ELSIF(L_ASIGNAR_PLAZO is NULL)THEN
            select NVL(t.tasa_nacional_activa,0) INTO L_TASA 
            from (select * from cfg_costo_fondeo where cantidad_dias_maximo>=90 and estado=1
            order by cantidad_dias_maximo) t where rownum=1;
        END IF;
      EXCEPTION
      WHEN OTHERS THEN
        BEGIN
            select NVL(t.tasa_nacional_activa,0) INTO L_TASA 
            from (select * from cfg_costo_fondeo where cantidad_dias_maximo>=90 and estado=1
            order by cantidad_dias_maximo) t where rownum=1;
        EXCEPTION
        WHEN OTHERS THEN
          BEGIN
            select NVL(t.tasa_nacional_activa,0) INTO L_TASA 
            from (select * from cfg_costo_fondeo where estado=1
            order by cantidad_dias_maximo desc) t where rownum=1;
          EXCEPTION
          WHEN OTHERS THEN
            L_TASA:=0;
          END;
        END;
      END;
      UPDATE CFG_MEDIO_PAGO SET SPREAD_TC=L_TASA WHERE CODIGO_CENTRAL=X.CODIGO_CENTRAL;
      COMMIT;    
    END LOOP;
  END;
END;



PROCEDURE SP_POST_CARGA AS
BEGIN 
        --MARGEN TOTAL :
        UPDATE CFG_FINANZA SET MARGEN_TOTAL=margen_ord,editor=1,edicion=sysdate;
       MERGE INTO CFG_FINANZA FI
         USING (
          SELECT MARGEN_COLECTIVO,codigo_central FROM CFG_SISTEMA
          ) SIS
         ON (FI.codigo_central = SIS.codigo_central )
         WHEN MATCHED THEN 
           UPDATE SET
           FI.MARGEN_TOTAL    =NVL(FI.MARGEN_TOTAL,0) +NVL(SIS.MARGEN_COLECTIVO,0),
           FI.EDITOR          =1,
           FI.EDICION         =SYSDATE;        
           COMMIT;
        --UPDATE CFG_FINANZA SET MARGEN_TOTAL=0,editor=1,edicion=sysdate WHERE codigo_central NOT IN (SELECT codigo_central FROM CFG_SISTEMA);
       COMMIT;
       --AREA CENTRAL 
       update cfg_area_central set 
        CUOTA_RIESGO_DIRECTO        = CASE when DEUDA_DIRECTA_SBS<>0        or DEUDA_DIRECTA_SBS<>null        or RIESGO_DIRECTO_BBVA<>null        then (RIESGO_DIRECTO_BBVA/DEUDA_DIRECTA_SBS*100)else 0 end,
        CUOTA_RIESGO_INDIRECTO      = CASE when DEUDA_INDIRECTA_SBS<>0      or DEUDA_INDIRECTA_SBS<>null      or RIESGO_INDIRECTO_BBVA<>null      then (RIESGO_INDIRECTO_BBVA/DEUDA_INDIRECTA_SBS*100)else 0 end,
        CUOTA_RIESGO_TOTAL          = CASE when DEUDA_TOTAL_SBS<>0          or DEUDA_TOTAL_SBS<>null          or RIESGO_TOTAL<>null               then (RIESGO_TOTAL/DEUDA_TOTAL_SBS*100)else 0 end,       
        CUOTA_RIESGO_DIRECTO_ACUM   = CASE when DEUDA_DIRECTA_SBS_ACUM<>0   or DEUDA_DIRECTA_SBS_ACUM<>null   or RIESGO_DIRECTO_BBVA_ACUM<>null   then (RIESGO_DIRECTO_BBVA_ACUM/DEUDA_DIRECTA_SBS_ACUM*100)else 0 end,
        CUOTA_RIESGO_INDIRECTO_ACUM = CASE when DEUDA_INDIRECTA_SBS_ACUM<>0 or DEUDA_INDIRECTA_SBS_ACUM<>null or RIESGO_INDIRECTO_BBVA_ACUM<>null then (RIESGO_INDIRECTO_BBVA_ACUM/DEUDA_INDIRECTA_SBS_ACUM*100)else 0 end,
        CUOTA_RIESGO_TOTAL_ACUM     = CASE when DEUDA_TOTAL_SBS_ACUM<>0     or DEUDA_TOTAL_SBS_ACUM<>null     or RIESGO_TOTAL_ACUM<>null          then (RIESGO_TOTAL_ACUM/DEUDA_TOTAL_SBS_ACUM*100) else 0 end,
        EDITOR=1,
        EDICION=SYSDATE;
        COMMIT;
        
        update cfg_finanza set
        SPREAD_CON = NVL(TASA_EFECTIVA_CON,0)-NVL(TASA_COSTO_CON,0),
        SPREAD_HIPO= NVL(TASA_EFECTIVA_HIPO,0)-NVL(TASA_COSTO_HIPO,0),
        EDITOR=1,
        EDICION=SYSDATE;
        COMMIT;
        
        UPDATE CFG_MEDIO_PAGO SET
        SPREAD_TC = NVL(TASA_EFECTIVA_TARJETA,0)-NVL(SPREAD_TC,0),
        EDITOR=1,
        EDICION=SYSDATE;
        COMMIT;
END;

PROCEDURE SP_POST_CARGA_TOTAL AS 
BEGIN
  SP_POST_CARGA_TASA_COSTO_CON;
  SP_POST_CARGA_TASA_COSTO_HIPO;
  SP_POST_CARGA_SPREAD_TC;
  SP_POST_CARGA;
  SP_POST_CARGA_MARGEN_MIX;
END;
PROCEDURE SP_POST_CARGA_MARGEN_MIX AS
BEGIN
 MERGE INTO CFG_FINANZA FIN
         USING (
          SELECT f.CODIGO_CENTRAL,mp.SPREAD_TC,ac.DEUDA_TARJ_BBVA,f.SPREAD_CON,ac.DEUDA_CONS_BBVA,f.SPREAD_HIPO,ac.DEUDA_HIPO_BBVA FROM cfg_area_central ac 
          inner join cfg_finanza f on f.codigo_central=ac.codigo_central 
          inner join cfg_medio_pago mp on mp.codigo_central=ac.codigo_central
          ) MIX
          ON (FIN.CODIGO_CENTRAL = MIX.CODIGO_CENTRAL)
          WHEN MATCHED THEN
            UPDATE SET
              FIN.MARGEN_MIX = (MIX.SPREAD_TC*MIX.DEUDA_TARJ_BBVA)+(MIX.SPREAD_CON*MIX.DEUDA_CONS_BBVA)+(MIX.SPREAD_HIPO*MIX.DEUDA_HIPO_BBVA);
              COMMIT;   
END;

PROCEDURE SP_CARGAR_RIESGO( archivo IN varchar2 , msj_error OUT varchar2) AS
BEGIN 
  EXECUTE IMMEDIATE('ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '', ''');	
  EXECUTE IMMEDIATE 'alter TABLE MODPRE.CFG_RIESGO_EXT LOCATION ('''||archivo||''')';
      MERGE INTO CFG_RIESGO R
         USING (
          SELECT CODIGO_CENTRAL,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(VENTAS_TOTALES,' ',''),',',''),'.',',')))VENTAS_TOTALES,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(PUNTAJE_BURO,' ',''),',',''),'.',',')))PUNTAJE_BURO,GRUPO_BURO,ESCALA_RATING,PERIODO_RATING,GRUPO_ECONOMICO, MONEDA_VENTAS_TOTALES
          FROM cfg_riesgo_ext
          ) REX
         ON (R.CODIGO_CENTRAL = REX.CODIGO_CENTRAL )
         WHEN MATCHED THEN 
           UPDATE SET
           R.VENTAS_TOTALES         = REX.VENTAS_TOTALES,
           R.PUNTAJE_BURO           = 100-REX.PUNTAJE_BURO,
           R.GRUPO_BURO             = REX.GRUPO_BURO,
           R.ESCALA_RATING          = REX.ESCALA_RATING,
           R.PERIODO_RATING         = REX.PERIODO_RATING,
           R.GRUPO_ECONOMICO        = REX.GRUPO_ECONOMICO,
           R.MONEDA_VENTAS_TOTALES  = REX.MONEDA_VENTAS_TOTALES,
           R.EDITOR                 =1,
           R.EDICION                =SYSDATE
         WHEN NOT MATCHED THEN 
           INSERT (ID,CODIGO_CENTRAL,VENTAS_TOTALES,PUNTAJE_BURO,GRUPO_BURO,ESCALA_RATING,PERIODO_RATING,GRUPO_ECONOMICO,MONEDA_VENTAS_TOTALES,CREADOR,CREACION)
          VALUES(SQ_CFG_RIESGO.NEXTVAL,REX.CODIGO_CENTRAL,REX.VENTAS_TOTALES,100-REX.PUNTAJE_BURO,REX.GRUPO_BURO,REX.ESCALA_RATING,REX.PERIODO_RATING,REX.GRUPO_ECONOMICO,REX.MONEDA_VENTAS_TOTALES,1,SYSDATE);
    COMMIT;   
    EXCEPTION
    WHEN OTHERS THEN
    msj_error:= SUBSTR(SQLERRM,1,150);
END;
PROCEDURE SP_CARGAR_AREA_CENTRAL( archivo IN varchar2 , msj_error OUT varchar2) AS
BEGIN 
  EXECUTE IMMEDIATE('ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '', ''');
  EXECUTE IMMEDIATE 'alter TABLE MODPRE.CFG_AREA_CENTRAL_EXT LOCATION ('''||archivo||''')';
      MERGE INTO CFG_AREA_CENTRAL AC
         USING (
          SELECT CODIGO_CENTRAL,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(RIESGO_DIRECTO_BBVA,' ',''),',',''),'.',','))) RIESGO_DIRECTO_BBVA,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(RIESGO_INDIRECTO_BBVA,' ',''),',',''),'.',',')))RIESGO_INDIRECTO_BBVA,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(RIESGO_TOTAL,' ',''),',',''),'.',',')))RIESGO_TOTAL,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(DEUDA_DIRECTA_BBVA,' ',''),',',''),'.',',')))DEUDA_DIRECTA_BBVA,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(DEUDA_INDIRECTA_BBVA,' ',''),',',''),'.',',')))DEUDA_INDIRECTA_BBVA,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(DEUDA_TOTAL_BBVA,' ',''),',',''),'.',',')))DEUDA_TOTAL_BBVA,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(DEUDA_TOTAL_OTROS,' ',''),',',''),'.',',')))DEUDA_TOTAL_OTROS,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(DEUDA_DIRECTA_SBS,' ',''),',',''),'.',',')))DEUDA_DIRECTA_SBS,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(DEUDA_INDIRECTA_SBS,' ',''),',',''),'.',',')))DEUDA_INDIRECTA_SBS,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(DEUDA_TOTAL_SBS,' ',''),',',''),'.',',')))DEUDA_TOTAL_SBS,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(DEUDA_HIPO_BBVA,' ',''),',',''),'.',',')))DEUDA_HIPO_BBVA,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(DEUDA_CONS_BBVA,' ',''),',',''),'.',',')))DEUDA_CONS_BBVA,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(DEUDA_TARJ_BBVA,' ',''),',',''),'.',',')))DEUDA_TARJ_BBVA,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(DEUDA_HIPO_OTROS,' ',''),',',''),'.',',')))DEUDA_HIPO_OTROS,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(DEUDA_CONS_OTROS,' ',''),',',''),'.',',')))DEUDA_CONS_OTROS,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(DEUDA_TARJ_OTROS,' ',''),',',''),'.',',')))DEUDA_TARJ_OTROS,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(CANT_FRAM_PROD,' ',''),',',''),'.',',')))CANT_FRAM_PROD,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(MONTO_HIPO_OTROS,' ',''),',',''),'.',',')))MONTO_HIPO_OTROS,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(MONTO_CONS_OTROS,' ',''),',',''),'.',',')))MONTO_CONS_OTROS,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(MONTO_TARJ_OTROS,' ',''),',',''),'.',',')))MONTO_TARJ_OTROS,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(CUOTA_RIESGO_DIRECTO,' ',''),',',''),'.',',')))CUOTA_RIESGO_DIRECTO,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(CUOTA_RIESGO_INDIRECTO,' ',''),',',''),'.',',')))CUOTA_RIESGO_INDIRECTO,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(CUOTA_RIESGO_TOTAL,' ',''),',',''),'.',',')))CUOTA_RIESGO_TOTAL,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(CUOTA_RIESGO_TOTAL_ACUM,' ',''),',',''),'.',',')))CUOTA_RIESGO_TOTAL_ACUM,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(CUOTA_RIESGO_DIRECTO_ACUM,' ',''),',',''),'.',',')))CUOTA_RIESGO_DIRECTO_ACUM,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(CUOTA_RIESGO_INDIRECTO_ACUM,' ',''),',',''),'.',',')))CUOTA_RIESGO_INDIRECTO_ACUM
          FROM CFG_AREA_CENTRAL_EXT
          ) ACEX
         ON (AC.CODIGO_CENTRAL = ACEX.CODIGO_CENTRAL )
         WHEN MATCHED THEN 
           UPDATE SET
          AC.RIESGO_DIRECTO_BBVA			    =ACEX.RIESGO_DIRECTO_BBVA,
          AC.RIESGO_INDIRECTO_BBVA		    =ACEX.RIESGO_INDIRECTO_BBVA,		
          AC.RIESGO_TOTAL					        =ACEX.RIESGO_TOTAL,					
          AC.DEUDA_DIRECTA_BBVA			      =ACEX.DEUDA_DIRECTA_BBVA,			
          AC.DEUDA_INDIRECTA_BBVA			    =ACEX.DEUDA_INDIRECTA_BBVA,			
          AC.DEUDA_TOTAL_BBVA				      =ACEX.DEUDA_TOTAL_BBVA,				
          AC.DEUDA_TOTAL_OTROS			      =ACEX.DEUDA_TOTAL_OTROS,			
          AC.DEUDA_DIRECTA_SBS			      =ACEX.DEUDA_DIRECTA_SBS,		
          AC.DEUDA_INDIRECTA_SBS			    =ACEX.DEUDA_INDIRECTA_SBS,			
          AC.DEUDA_TOTAL_SBS				      =ACEX.DEUDA_TOTAL_SBS,				
          AC.DEUDA_HIPO_BBVA				      =ACEX.DEUDA_HIPO_BBVA,				
          AC.DEUDA_CONS_BBVA				      =ACEX.DEUDA_CONS_BBVA,					
          AC.DEUDA_TARJ_BBVA				      =ACEX.DEUDA_TARJ_BBVA,				
          AC.DEUDA_HIPO_OTROS				      =ACEX.DEUDA_HIPO_OTROS,				
          AC.DEUDA_CONS_OTROS				      =ACEX.DEUDA_CONS_OTROS,			
          AC.DEUDA_TARJ_OTROS				      =ACEX.DEUDA_TARJ_OTROS,			
          AC.CANT_FRAM_PROD				        =ACEX.CANT_FRAM_PROD,				
          AC.MONTO_HIPO_OTROS				      =ACEX.MONTO_HIPO_OTROS,				
          AC.MONTO_CONS_OTROS				      =ACEX.MONTO_CONS_OTROS,				
          AC.MONTO_TARJ_OTROS				      =ACEX.MONTO_TARJ_OTROS,				
          AC.CUOTA_RIESGO_DIRECTO			    =ACEX.CUOTA_RIESGO_DIRECTO,			
          AC.CUOTA_RIESGO_INDIRECTO		    =ACEX.CUOTA_RIESGO_INDIRECTO,		
          AC.CUOTA_RIESGO_TOTAL			      =ACEX.CUOTA_RIESGO_TOTAL,			
          AC.CUOTA_RIESGO_TOTAL_ACUM		  =ACEX.CUOTA_RIESGO_TOTAL_ACUM,		
          AC.CUOTA_RIESGO_DIRECTO_ACUM	  =ACEX.CUOTA_RIESGO_DIRECTO_ACUM,	
          AC.CUOTA_RIESGO_INDIRECTO_ACUM	=ACEX.CUOTA_RIESGO_INDIRECTO_ACUM,
          
          AC.RIESGO_DIRECTO_BBVA_ACUM     =AC.RIESGO_DIRECTO_BBVA_ACUM + ACEX.RIESGO_DIRECTO_BBVA,
          AC.RIESGO_INDIRECTO_BBVA_ACUM   =AC.RIESGO_INDIRECTO_BBVA_ACUM + ACEX.RIESGO_INDIRECTO_BBVA,
          AC.RIESGO_TOTAL_ACUM            =AC.RIESGO_TOTAL_ACUM + ACEX.RIESGO_TOTAL,
          AC.DEUDA_DIRECTA_SBS_ACUM      =AC.DEUDA_DIRECTA_SBS_ACUM + ACEX.DEUDA_DIRECTA_SBS,
          AC.DEUDA_INDIRECTA_SBS_ACUM    =AC.DEUDA_INDIRECTA_SBS_ACUM + ACEX.DEUDA_INDIRECTA_SBS,
          AC.DEUDA_TOTAL_SBS_ACUM        =AC.DEUDA_TOTAL_SBS_ACUM + ACEX.DEUDA_TOTAL_SBS,
          
          AC.EDITOR                       =1,
          AC.EDICION                      =SYSDATE
         WHEN NOT MATCHED THEN 
           INSERT (ID,CODIGO_CENTRAL,RIESGO_DIRECTO_BBVA,RIESGO_INDIRECTO_BBVA,RIESGO_TOTAL,DEUDA_DIRECTA_BBVA,DEUDA_INDIRECTA_BBVA,DEUDA_TOTAL_BBVA,DEUDA_TOTAL_OTROS,DEUDA_DIRECTA_SBS,DEUDA_INDIRECTA_SBS,DEUDA_TOTAL_SBS,DEUDA_HIPO_BBVA,DEUDA_CONS_BBVA,DEUDA_TARJ_BBVA,DEUDA_HIPO_OTROS,DEUDA_CONS_OTROS,DEUDA_TARJ_OTROS,CANT_FRAM_PROD,MONTO_HIPO_OTROS,MONTO_CONS_OTROS,MONTO_TARJ_OTROS,CUOTA_RIESGO_DIRECTO,CUOTA_RIESGO_INDIRECTO,CUOTA_RIESGO_TOTAL,CUOTA_RIESGO_TOTAL_ACUM,CUOTA_RIESGO_DIRECTO_ACUM,CUOTA_RIESGO_INDIRECTO_ACUM,CREADOR,CREACION)
          VALUES(SQ_CFG_AREA_CENTRAL.NEXTVAL,ACEX.CODIGO_CENTRAL,ACEX.RIESGO_DIRECTO_BBVA,ACEX.RIESGO_INDIRECTO_BBVA,ACEX.RIESGO_TOTAL,ACEX.DEUDA_DIRECTA_BBVA,ACEX.DEUDA_INDIRECTA_BBVA,ACEX.DEUDA_TOTAL_BBVA,ACEX.DEUDA_TOTAL_OTROS,ACEX.DEUDA_DIRECTA_SBS,ACEX.DEUDA_INDIRECTA_SBS,ACEX.DEUDA_TOTAL_SBS,ACEX.DEUDA_HIPO_BBVA,ACEX.DEUDA_CONS_BBVA,ACEX.DEUDA_TARJ_BBVA,ACEX.DEUDA_HIPO_OTROS,ACEX.DEUDA_CONS_OTROS,ACEX.DEUDA_TARJ_OTROS,ACEX.CANT_FRAM_PROD,ACEX.MONTO_HIPO_OTROS,ACEX.MONTO_CONS_OTROS,ACEX.MONTO_TARJ_OTROS,ACEX.CUOTA_RIESGO_DIRECTO,ACEX.CUOTA_RIESGO_INDIRECTO,ACEX.CUOTA_RIESGO_TOTAL,ACEX.CUOTA_RIESGO_TOTAL_ACUM,ACEX.CUOTA_RIESGO_DIRECTO_ACUM,ACEX.CUOTA_RIESGO_INDIRECTO_ACUM,1,SYSDATE);
    COMMIT;   
    EXCEPTION
    WHEN OTHERS THEN
    msj_error:= SUBSTR(SQLERRM,1,150);
END;

PROCEDURE SP_CARGAR_SISTEMA( archivo IN varchar2 , msj_error OUT varchar2) AS
BEGIN 
  EXECUTE IMMEDIATE('ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '', ''');
  EXECUTE IMMEDIATE 'alter TABLE MODPRE.CFG_SISTEMA_EXT LOCATION ('''||archivo||''')';
      MERGE INTO CFG_SISTEMA S
         USING (
          SELECT CODIGO_CENTRAL,
TO_NUMBER(REPLACE(REPLACE(REPLACE(FLUJO_PAGO_PROVEE,' ',''),',',''),'.',','))FLUJO_PAGO_PROVEE,
TO_NUMBER(REPLACE(REPLACE(REPLACE(FLUJO_PAGO_HABERES,' ','' ),',',''),'.',',')) FLUJO_PAGO_HABERES,
TO_NUMBER(REPLACE(REPLACE(REPLACE(CANTIDAD_EMPLEAD_PH,' ','' ),',',''),'.',',')) CANTIDAD_EMPLEAD_PH,
TO_NUMBER(REPLACE(REPLACE(REPLACE(PASIVO_BBVA,' ','' ),',',''),'.',',')) PASIVO_BBVA,
TO_NUMBER(REPLACE(REPLACE(REPLACE(MARGEN_COLECTIVO,' ','' ),',',''),'.',',')) MARGEN_COLECTIVO,
REPLACE(REPLACE(REPLACE(ES_PAGO_HABIENTE,' ','' ),',',''),'.',',') ES_PAGO_HABIENTE,
CARGO,
CENTRO_LABORES,
TO_NUMBER(INGRNOMI)INGRNOMI,
TO_NUMBER(INGRCTAP)INGRCTAP,
TO_NUMBER(INGRVARS)INGRVARS,
TO_NUMBER(INGROTRO)INGROTRO,
TO_NUMBER(INGRPENS)INGRPENS,
TO_NUMBER(INGR2TRA)INGR2TRA,
TO_NUMBER(INGRRENT)INGRRENT,
TO_NUMBER(INGRTOTAL)INGRTOTAL,
FLAG_BE_CONTINET_CASH,
FLAG_BE_CONTIFAX,
FLAG_BE_USO_MONETARIO,
FLAG_BE_MODULO_BEX,
FLAG_SP_TARJETA_CREDITO,
FLAG_SP_HABERES,
FLAG_SP_CTS,
FLAG_SP_AFP,
FLAG_SP_ADUANAS,
FLAG_SP_PROVEEDORES,
FLAG_SP_DETRACCIONES,
FLAG_SP_TRANSF_EXTERIOR,
FLAG_SC_SERV_PUBLICO,
FLAG_SC_RECAUDO,
FLAG_SC_DEP_ESP,
FLAG_SC_TRANSF_INTERB,
FLAG_SC_COB_LIB,
FLAG_SC_COB_IMP,
FLAG_SC_COB_EXP,
TO_NUMBER(LTRIM(REPLACE(REPLACE(REPLACE(MARGEN_COLECTIVO_ACUMULADO,' ','' ),',',''),'.',','),'0')) MARGEN_COLECTIVO_ACUMULADO
          FROM CFG_SISTEMA_EXT
          ) SX
         ON (S.CODIGO_CENTRAL = SX.CODIGO_CENTRAL )
         WHEN MATCHED THEN 
           UPDATE SET	
          S.FLUJO_PAGO_PROVEE	=SX.FLUJO_PAGO_PROVEE,
          S.FLUJO_PAGO_HABERES		  =SX.FLUJO_PAGO_HABERES,	
          S.CANTIDAD_EMPLEAD_PH				      =SX.CANTIDAD_EMPLEAD_PH,							
          S.PASIVO_BBVA					        =SX.PASIVO_BBVA,			
          S.MARGEN_COLECTIVO      =SX.MARGEN_COLECTIVO,
          S.ES_PAGO_HABIENTE			=SX.ES_PAGO_HABIENTE,
          S.CARGO								  =SX.CARGO,
          S.CENTRO_LABORES                      =SX.CENTRO_LABORES,
          S.INGRNOMI                            =SX.INGRNOMI,
          S.INGRCTAP                            =SX.INGRCTAP,
          S.INGRVARS                            =SX.INGRVARS,
          S.INGROTRO                            =SX.INGROTRO,
          S.INGRPENS                            =SX.INGRPENS,
          S.INGR2TRA                            =SX.INGR2TRA,
          S.INGRRENT                            =SX.INGRRENT,
          S.INGRTOTAL                           =SX.INGRTOTAL,
          S.FLAG_BE_CONTINET_CASH               =SX.FLAG_BE_CONTINET_CASH,
          S.FLAG_BE_CONTIFAX                    =SX.FLAG_BE_CONTIFAX,
          S.FLAG_BE_USO_MONETARIO               =SX.FLAG_BE_USO_MONETARIO,
          S.FLAG_BE_MODULO_BEX                  =SX.FLAG_BE_MODULO_BEX,
          S.FLAG_SP_TARJETA_CREDITO             =SX.FLAG_SP_TARJETA_CREDITO,
          S.FLAG_SP_HABERES                     =SX.FLAG_SP_HABERES,
          S.FLAG_SP_CTS                         =SX.FLAG_SP_CTS,
          S.FLAG_SP_AFP                         =SX.FLAG_SP_AFP,
          S.FLAG_SP_ADUANAS                     =SX.FLAG_SP_ADUANAS,
          S.FLAG_SP_PROVEEDORES                 =SX.FLAG_SP_PROVEEDORES,
          S.FLAG_SP_DETRACCIONES                =SX.FLAG_SP_DETRACCIONES,
          S.FLAG_SP_TRANSF_EXTERIOR             =SX.FLAG_SP_TRANSF_EXTERIOR,
          S.FLAG_SC_SERV_PUBLICO                =SX.FLAG_SC_SERV_PUBLICO,
          S.FLAG_SC_RECAUDO                     =SX.FLAG_SC_RECAUDO,
          S.FLAG_SC_DEP_ESP                     =SX.FLAG_SC_DEP_ESP,
          S.FLAG_SC_TRANSF_INTERB               =SX.FLAG_SC_TRANSF_INTERB,
          S.FLAG_SC_COB_LIB                     =SX.FLAG_SC_COB_LIB,
          S.FLAG_SC_COB_IMP                     =SX.FLAG_SC_COB_IMP,
          S.FLAG_SC_COB_EXP                     =SX.FLAG_SC_COB_EXP,
          S.MARGEN_COLECTIVO_ACUMULADO          =SX.MARGEN_COLECTIVO_ACUMULADO,
          S.EDITOR					=1,			
          S.EDICION				=SYSDATE			
         WHEN NOT MATCHED THEN 
          INSERT (ID,CODIGO_CENTRAL,FLUJO_PAGO_PROVEE,FLUJO_PAGO_HABERES,CANTIDAD_EMPLEAD_PH,PASIVO_BBVA,MARGEN_COLECTIVO,ES_PAGO_HABIENTE,CARGO,CENTRO_LABORES,INGRNOMI,INGRCTAP,INGRVARS,INGROTRO,INGRPENS,INGR2TRA,INGRRENT,INGRTOTAL,FLAG_BE_CONTINET_CASH,FLAG_BE_CONTIFAX,FLAG_BE_USO_MONETARIO,FLAG_BE_MODULO_BEX,FLAG_SP_TARJETA_CREDITO,FLAG_SP_HABERES,FLAG_SP_CTS,FLAG_SP_AFP,FLAG_SP_ADUANAS,FLAG_SP_PROVEEDORES,FLAG_SP_DETRACCIONES,FLAG_SP_TRANSF_EXTERIOR,FLAG_SC_SERV_PUBLICO,FLAG_SC_RECAUDO,FLAG_SC_DEP_ESP,FLAG_SC_TRANSF_INTERB,FLAG_SC_COB_LIB,FLAG_SC_COB_IMP,FLAG_SC_COB_EXP,MARGEN_COLECTIVO_ACUMULADO,CREADOR,CREACION)
          VALUES(SQ_CFG_SISTEMA.NEXTVAL,SX.CODIGO_CENTRAL,SX.FLUJO_PAGO_PROVEE,SX.FLUJO_PAGO_HABERES,SX.CANTIDAD_EMPLEAD_PH,SX.PASIVO_BBVA,SX.MARGEN_COLECTIVO,SX.ES_PAGO_HABIENTE,SX.CARGO,SX.CENTRO_LABORES,SX.INGRNOMI,SX.INGRCTAP,SX.INGRVARS,SX.INGROTRO,SX.INGRPENS,SX.INGR2TRA,SX.INGRRENT,SX.INGRTOTAL,SX.FLAG_BE_CONTINET_CASH,SX.FLAG_BE_CONTIFAX,SX.FLAG_BE_USO_MONETARIO,SX.FLAG_BE_MODULO_BEX,SX.FLAG_SP_TARJETA_CREDITO,SX.FLAG_SP_HABERES,SX.FLAG_SP_CTS,SX.FLAG_SP_AFP,SX.FLAG_SP_ADUANAS,SX.FLAG_SP_PROVEEDORES,SX.FLAG_SP_DETRACCIONES,SX.FLAG_SP_TRANSF_EXTERIOR,SX.FLAG_SC_SERV_PUBLICO,SX.FLAG_SC_RECAUDO,SX.FLAG_SC_DEP_ESP,SX.FLAG_SC_TRANSF_INTERB,SX.FLAG_SC_COB_LIB,SX.FLAG_SC_COB_IMP,SX.FLAG_SC_COB_EXP,SX.MARGEN_COLECTIVO_ACUMULADO,1,SYSDATE);
    COMMIT; 
    EXCEPTION
    WHEN OTHERS THEN
    msj_error:= SUBSTR(SQLERRM,1,150);
  
END;

PROCEDURE SP_SPREAD_CLI_FIN_OFI AS
BEGIN

BEGIN
 MERGE INTO CFG_SPREAD_FINANCIERO SF
         USING (
          select doi,sum((spread)*monto_credito)/sum(monto_credito) spread_cliente from (select c.doi, (o.tea_final-costo_fondeo) spread, monto_credito from sol_operacion  o
          inner join sol_solicitud s on s.id=o.solicitud
          inner join cli_cliente c on s.cliente=c.id 
          INNER JOIN sol_situacion sit on o.situacion=sit.id
          INNER JOIN cfg_valor v on c.tipo_doi=v.id
          where sit.codigo='CON'
          and v.codigo='R'
          and (TRUNC(o.creacion) between TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE,-2))+1) and TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE,-1))))
          ) t group by t.doi
          ) R
         ON (SF.DOI_CODIGO = R.DOI )
         WHEN MATCHED THEN 
           UPDATE SET
            SF.TIPO_SPREAD      ='CLIENTE',
            SF.VALOR_SPREAD_MES =R.spread_cliente,
            SF.PERIODO_ANIO     =to_char(sysdate,'YYYY'),
            SF.PERIODO_MES      =to_char(sysdate,'MM')
        WHEN NOT MATCHED THEN 
insert (id,doi_codigo,tipo_spread,VALOR_SPREAD_MES,periodo_anio,periodo_mes) values(SQ_CFG_SPREAD_FIN.NEXTVAL,R.doi,'CLIENTE',R.SPREAD_CLIENTE,to_char(sysdate,'YYYY'),to_char(sysdate,'MM'));
END;

BEGIN
MERGE INTO CFG_SPREAD_FINANCIERO SF
      USING (
      select registro,sum((spread)*monto_credito)/sum(monto_credito) spread_cliente from (select c.registro, (o.tea_final-costo_fondeo) spread, monto_credito from sol_operacion  o 
      inner join sol_solicitud s on s.id=o.solicitud 
      inner join seg_usuario c on s.responsable=c.id  
      INNER JOIN sol_situacion sit on o.situacion=sit.id
      where sit.codigo='CON'
      and (TRUNC(o.creacion) between TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE,-2))+1) and TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE,-1))))
      ) t group by t.registro
      ) R
       ON (SF.DOI_CODIGO = R.registro )
         WHEN MATCHED THEN 
           UPDATE SET
            SF.TIPO_SPREAD      ='EJECUTIVO',
            SF.VALOR_SPREAD_MES =R.spread_cliente,
            SF.PERIODO_ANIO     =to_char(sysdate,'YYYY'),
            SF.PERIODO_MES      =to_char(sysdate,'MM')
        WHEN NOT MATCHED THEN 
insert (id,doi_codigo,tipo_spread,VALOR_SPREAD_MES,periodo_anio,periodo_mes) values(SQ_CFG_SPREAD_FIN.NEXTVAL,R.registro,'EJECUTIVO',R.SPREAD_CLIENTE,to_char(sysdate,'YYYY'),to_char(sysdate,'MM'));
END;

BEGIN
MERGE INTO CFG_SPREAD_FINANCIERO SF
      USING (
      select codigo_oficina,sum((spread)*monto_credito)/sum(monto_credito) spread_cliente from (select s.codigo_oficina, (o.tea_final-costo_fondeo) spread, monto_credito from sol_operacion  o 
      inner join sol_solicitud s on s.id=o.solicitud 
      INNER JOIN sol_situacion sit on o.situacion=sit.id
      where sit.codigo='CON'
      and (TRUNC(o.creacion) between TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE,-2))+1) and TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE,-1))))
      ) t group by t.codigo_oficina
      ) R
       ON (SF.DOI_CODIGO = R.codigo_oficina )
         WHEN MATCHED THEN 
           UPDATE SET
            SF.TIPO_SPREAD      ='OFICINA',
            SF.VALOR_SPREAD_MES =R.spread_cliente,
            SF.PERIODO_ANIO     =to_char(sysdate,'YYYY'),
            SF.PERIODO_MES      =to_char(sysdate,'MM')
        WHEN NOT MATCHED THEN 
insert (id,doi_codigo,tipo_spread,VALOR_SPREAD_MES,periodo_anio,periodo_mes) values(SQ_CFG_SPREAD_FIN.NEXTVAL,R.codigo_oficina,'OFICINA',R.SPREAD_CLIENTE,to_char(sysdate,'YYYY'),to_char(sysdate,'MM'));
END;

END;

PROCEDURE SP_CARGAR_MEDIO_PAGO( archivo IN varchar2 , msj_error OUT varchar2) AS
BEGIN 
  EXECUTE IMMEDIATE('ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '', ''');	
  EXECUTE IMMEDIATE 'alter TABLE MODPRE.CFG_MEDIO_PAGO_EXT LOCATION ('''||archivo||''')';
      MERGE INTO CFG_MEDIO_PAGO MP
         USING (
          SELECT CODIGO_CENTRAL,TRIM(TO_NUMBER(REPLACE(REPLACE(LINEA_MAX_TC_BBVA,',',''),'.',',')))LINEA_MAX_TC_BBVA,TRIM(TO_NUMBER(REPLACE(REPLACE(TASA_EFECTIVA_TARJETA,',',''),'.',',')))TASA_EFECTIVA_TARJETA,TRIM(TO_NUMBER(REPLACE(REPLACE(TASA_COSTO_TARJETA,',',''),'.',',')))TASA_COSTO_TARJETA,TRIM(TO_NUMBER(REPLACE(REPLACE(SPREAD_TC,',',''),'.',',')))SPREAD_TC 
          FROM CFG_MEDIO_PAGO_EXT
          ) MPEX
         ON (MP.CODIGO_CENTRAL = MPEX.CODIGO_CENTRAL )
         WHEN MATCHED THEN 
           UPDATE SET
          MP.LINEA_MAX_TC_BBVA		  =NVL(MPEX.LINEA_MAX_TC_BBVA,0),	
          MP.TASA_EFECTIVA_TARJETA	=NVL(MPEX.TASA_EFECTIVA_TARJETA,0),
          MP.TASA_COSTO_TARJETA		  =NVL(MPEX.TASA_COSTO_TARJETA,0),	
          MP.SPREAD_TC				      =NVL(MPEX.SPREAD_TC,0),							
          MP.EDITOR					        =1,			
          MP.EDICION					      =SYSDATE			
         WHEN NOT MATCHED THEN 
          INSERT (ID,CODIGO_CENTRAL,LINEA_MAX_TC_BBVA,TASA_EFECTIVA_TARJETA,TASA_COSTO_TARJETA,SPREAD_TC,CREADOR,CREACION)
          VALUES(SQ_CFG_MEDIO_PAGO.NEXTVAL,MPEX.CODIGO_CENTRAL,MPEX.LINEA_MAX_TC_BBVA,MPEX.TASA_EFECTIVA_TARJETA,MPEX.TASA_COSTO_TARJETA,MPEX.SPREAD_TC,1,SYSDATE);
    COMMIT;    
    EXCEPTION
    WHEN OTHERS THEN
    msj_error:= SUBSTR(SQLERRM,1,150);
END;


PROCEDURE SP_CARGAR_FINANZA( archivo IN varchar2 , msj_error OUT varchar2) AS
BEGIN 
  EXECUTE IMMEDIATE 'alter TABLE MODPRE.CFG_FINANZA_EXT LOCATION ('''||archivo||''')';
      MERGE INTO CFG_FINANZA F
         USING (
          SELECT CODIGO_CENTRAL,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(MARGEN_FINAN,' ',''),',',''),'.',','))) MARGEN_FINAN,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(MARGEN_FINAN_ACUM,' ',''),',',''),'.',','))) MARGEN_FINAN_ACUM,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(MARGEN_ORD,' ',''),',',''),'.',','))) MARGEN_ORD,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(MARGEN_ORDI_ACUM,' ',''),',',''),'.',','))) MARGEN_ORDI_ACUM,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(SALDO_MEDIO_PAS,' ',''),',',''),'.',','))) SALDO_MEDIO_PAS,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(SALDO_MEDIO_ACT,' ',''),',',''),'.',','))) SALDO_MEDIO_ACT,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(TASA_EFECTIVA_HIPO,' ',''),',',''),'.',','))) TASA_EFECTIVA_HIPO,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(TASA_COSTO_HIPO,' ',''),',',''),'.',','))) TASA_COSTO_HIPO,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(SPREAD_HIPO,' ',''),',',''),'.',','))) SPREAD_HIPO,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(TASA_EFECTIVA_CON,' ',''),',',''),'.',','))) TASA_EFECTIVA_CON,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(TASA_COSTO_CON,' ',''),',',''),'.',','))) TASA_COSTO_CON,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(SPREAD_CON,' ',''),',',''),'.',','))) SPREAD_CON,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(COMISIONES_MES,' ',''),',',''),'.',','))) COMISIONES_MES,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(COMISIONES_ACUM,' ',''),',',''),'.',','))) COMISIONES_ACUM,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(MARGEN_TOTAL,' ',''),',',''),'.',','))) MARGEN_TOTAL,MONEDA_SALDO_MEDIO_PASIVO,MONEDA_SALDO_MEDIO_ACTIVO,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(MARGEN_MIX,' ',''),',',''),'.',','))) MARGEN_MIX,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(SPREAD_CLIENTE,' ',''),',',''),'.',','))) SPREAD_CLIENTE,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(SPREAD_EJECUTIVO,' ',''),',',''),'.',','))) SPREAD_EJECUTIVO,TRIM(TO_NUMBER(REPLACE(REPLACE(REPLACE(SPREAD_OFICINA,' ',''),',',''),'.',','))) SPREAD_OFICINA,PLAZO_CON,MONEDA_CON,PLAZO_HIPO,MONEDA_HIPO
          FROM CFG_FINANZA_EXT
          ) FEX
         ON (F.CODIGO_CENTRAL = FEX.CODIGO_CENTRAL )
         WHEN MATCHED THEN 
           UPDATE SET
          F.MARGEN_FINAN					      =FEX.MARGEN_FINAN,				
          F.MARGEN_FINAN_ACUM				    =FEX.MARGEN_FINAN_ACUM,
          F.MARGEN_ORD					        =FEX.MARGEN_ORD,				
          F.MARGEN_ORDI_ACUM				    =FEX.MARGEN_ORDI_ACUM,			
          F.SALDO_MEDIO_PAS				      =FEX.SALDO_MEDIO_PAS,			
          F.SALDO_MEDIO_ACT				      =FEX.SALDO_MEDIO_ACT,			
          F.TASA_EFECTIVA_HIPO			    =FEX.TASA_EFECTIVA_HIPO,		
          F.TASA_COSTO_HIPO				      =FEX.TASA_COSTO_HIPO,			
          F.SPREAD_HIPO					        =FEX.SPREAD_HIPO,				
          F.TASA_EFECTIVA_CON				    =FEX.TASA_EFECTIVA_CON,			
          F.TASA_COSTO_CON				      =FEX.TASA_COSTO_CON,			
          F.SPREAD_CON					        =FEX.SPREAD_CON,				
          F.COMISIONES_MES				      =FEX.COMISIONES_MES,			
          F.COMISIONES_ACUM				      =FEX.COMISIONES_ACUM,			
          F.MARGEN_TOTAL					      =FEX.MARGEN_TOTAL,				
          F.MONEDA_SALDO_MEDIO_PASIVO		=FEX.MONEDA_SALDO_MEDIO_PASIVO,
          F.MONEDA_SALDO_MEDIO_ACTIVO		=FEX.MONEDA_SALDO_MEDIO_ACTIVO,
          F.MARGEN_MIX					        =FEX.MARGEN_MIX,				
          F.SPREAD_CLIENTE				      =FEX.SPREAD_CLIENTE,			
          F.SPREAD_EJECUTIVO				    =FEX.SPREAD_EJECUTIVO,			
          F.SPREAD_OFICINA				      =FEX.SPREAD_OFICINA,			
          F.PLAZO_CON						        =FEX.PLAZO_CON,					
          F.MONEDA_CON					        =FEX.MONEDA_CON,				
          F.PLAZO_HIPO					        =FEX.PLAZO_HIPO,				
          F.MONEDA_HIPO					        =FEX.MONEDA_HIPO,
          F.EDITOR                      =1,
          F.EDICION                     =SYSDATE
         WHEN NOT MATCHED THEN 
          INSERT (ID,CODIGO_CENTRAL,MARGEN_FINAN,MARGEN_FINAN_ACUM,MARGEN_ORD,MARGEN_ORDI_ACUM,SALDO_MEDIO_PAS,SALDO_MEDIO_ACT,TASA_EFECTIVA_HIPO,TASA_COSTO_HIPO,SPREAD_HIPO,TASA_EFECTIVA_CON,TASA_COSTO_CON,SPREAD_CON,COMISIONES_MES,COMISIONES_ACUM,MARGEN_TOTAL,MONEDA_SALDO_MEDIO_PASIVO,MONEDA_SALDO_MEDIO_ACTIVO,MARGEN_MIX,SPREAD_CLIENTE,SPREAD_EJECUTIVO,SPREAD_OFICINA,PLAZO_CON,MONEDA_CON,PLAZO_HIPO,MONEDA_HIPO,CREADOR,CREACION)
          VALUES(SQ_CFG_FINANZA.NEXTVAL,FEX.CODIGO_CENTRAL,FEX.MARGEN_FINAN,FEX.MARGEN_FINAN_ACUM,FEX.MARGEN_ORD,FEX.MARGEN_ORDI_ACUM,FEX.SALDO_MEDIO_PAS,FEX.SALDO_MEDIO_ACT,FEX.TASA_EFECTIVA_HIPO,FEX.TASA_COSTO_HIPO,FEX.SPREAD_HIPO,FEX.TASA_EFECTIVA_CON,FEX.TASA_COSTO_CON,FEX.SPREAD_CON,FEX.COMISIONES_MES,FEX.COMISIONES_ACUM,FEX.MARGEN_TOTAL,FEX.MONEDA_SALDO_MEDIO_PASIVO,FEX.MONEDA_SALDO_MEDIO_ACTIVO,FEX.MARGEN_MIX,FEX.SPREAD_CLIENTE,FEX.SPREAD_EJECUTIVO,FEX.SPREAD_OFICINA,FEX.PLAZO_CON,FEX.MONEDA_CON,FEX.PLAZO_HIPO,FEX.MONEDA_HIPO,1,SYSDATE);
    COMMIT;  
    EXCEPTION
    WHEN OTHERS THEN
    msj_error:= SUBSTR(SQLERRM,1,150);
END;

PROCEDURE SP_PROCESO_CUARTIL AS
BEGIN
  FOR X IN (
    select * from cfg_rar where estado=1
  )LOOP 
    SP_AGRUPAR_CUARTIL(X.CODIGO_MONEDA,X.CODIGO_GRUPO_PRODUCTO,X.CODIGO_MONTO,
    X.VALOR_CLIENTE,X.SCORE_VINCULADO,X.CODIGO_PLAZO,X.TIPO_CARGA);
    COMMIT;
  END LOOP;
END;

PROCEDURE SP_AGRUPAR_CUARTIL(P_CODIGO_MONEDA	NUMBER,P_CODIGO_GRUPO_PRODUCTO	NUMBER,
  P_CODIGO_MONTO	NUMBER,P_VALOR_CLIENTE	NUMBER,P_SCORE_VINCULADO	NUMBER,P_CODIGO_PLAZO	NUMBER,
  P_TIPO_CARGA NUMBER) AS
BEGIN
  DECLARE
  CODIGO_TIPO_CARGA NVARCHAR2(20);
  N NUMBER(16,2):=0;
  POSICION NUMBER(16);
  RESTO NUMBER(16);
  LI NUMBER(16,2);
  LF NUMBER(16,2);
  P_CUARTIL_1 NUMBER(16,2);
  P_CUARTIL_2 NUMBER(16,2);
  P_CUARTIL_3 NUMBER(16,2);
  BEGIN
    select codigo into CODIGO_TIPO_CARGA from cfg_valor v where id=P_TIPO_CARGA;
    if CODIGO_TIPO_CARGA='BEC' then
      select count(tea_final) into N from sol_operacion o 
      inner join sol_solicitud s on s.id=o.solicitud
      inner join sol_tipo_banca t on t.id=s.tipo_banca
      where t.codigo='BEC' and o.concretado_directo=1 and
      o.codigo_moneda_rar=P_CODIGO_MONEDA and o.codigo_grupo_producto_rar=P_CODIGO_GRUPO_PRODUCTO and
      o.codigo_monto_rar=P_CODIGO_MONTO and o.valor_cliente_rar=P_VALOR_CLIENTE and o.score_vinculado_rar=P_SCORE_VINCULADO and
      o.codigo_plazo_rar is null
      order by tea_final;
      if N>=3 then
      RESTO:=Mod((1*(N+1)),4);
      if RESTO=0 then
        POSICION:=(1*(N+1))/4;
        select t.tea_final into P_CUARTIL_1 from( select t.tea_final, rownum fila from(select tea_final from sol_operacion o 
        inner join sol_solicitud s on s.id=o.solicitud
        inner join sol_tipo_banca t on t.id=s.tipo_banca
        where t.codigo='BEC' and o.concretado_directo=1 and
        o.codigo_moneda_rar=P_CODIGO_MONEDA and o.codigo_grupo_producto_rar=P_CODIGO_GRUPO_PRODUCTO and
        o.codigo_monto_rar=P_CODIGO_MONTO and o.valor_cliente_rar=P_VALOR_CLIENTE and o.score_vinculado_rar=P_SCORE_VINCULADO and
        o.codigo_plazo_rar is null
        order by tea_final) t) t where t.fila=POSICION;
      else
        POSICION:=((1*(N+1))-RESTO)/4;
        select t.tea_final into LI from( select t.tea_final, rownum fila from(select tea_final from sol_operacion o 
        inner join sol_solicitud s on s.id=o.solicitud
        inner join sol_tipo_banca t on t.id=s.tipo_banca
        where t.codigo='BEC' and o.concretado_directo=1 and
        o.codigo_moneda_rar=P_CODIGO_MONEDA and o.codigo_grupo_producto_rar=P_CODIGO_GRUPO_PRODUCTO and
        o.codigo_monto_rar=P_CODIGO_MONTO and o.valor_cliente_rar=P_VALOR_CLIENTE and o.score_vinculado_rar=P_SCORE_VINCULADO and
        o.codigo_plazo_rar is null
        order by tea_final) t) t where t.fila=POSICION;
        select t.tea_final into LF from( select t.tea_final, rownum fila from(select tea_final from sol_operacion o 
        inner join sol_solicitud s on s.id=o.solicitud
        inner join sol_tipo_banca t on t.id=s.tipo_banca
        where t.codigo='BEC' and o.concretado_directo=1 and
        o.codigo_moneda_rar=P_CODIGO_MONEDA and o.codigo_grupo_producto_rar=P_CODIGO_GRUPO_PRODUCTO and
        o.codigo_monto_rar=P_CODIGO_MONTO and o.valor_cliente_rar=P_VALOR_CLIENTE and o.score_vinculado_rar=P_SCORE_VINCULADO and
        o.codigo_plazo_rar is null
        order by tea_final) t) t where t.fila=(POSICION+1);
        P_CUARTIL_1:=LI+(1*(LF-LI)/4);
      end if;
      RESTO:=Mod((2*(N+1)),4);
      if RESTO=0 then
        POSICION:=(2*(N+1))/4;
        select t.tea_final into P_CUARTIL_2 from( select t.tea_final, rownum fila from(select tea_final from sol_operacion o 
        inner join sol_solicitud s on s.id=o.solicitud
        inner join sol_tipo_banca t on t.id=s.tipo_banca
        where t.codigo='BEC' and o.concretado_directo=1 and
        o.codigo_moneda_rar=P_CODIGO_MONEDA and o.codigo_grupo_producto_rar=P_CODIGO_GRUPO_PRODUCTO and
        o.codigo_monto_rar=P_CODIGO_MONTO and o.valor_cliente_rar=P_VALOR_CLIENTE and o.score_vinculado_rar=P_SCORE_VINCULADO and
        o.codigo_plazo_rar is null
        order by tea_final) t) t where t.fila=POSICION;
      else
        POSICION:=((2*(N+1))-RESTO)/4;
        select t.tea_final into LI from( select t.tea_final, rownum fila from(select tea_final from sol_operacion o 
        inner join sol_solicitud s on s.id=o.solicitud
        inner join sol_tipo_banca t on t.id=s.tipo_banca
        where t.codigo='BEC' and o.concretado_directo=1 and
        o.codigo_moneda_rar=P_CODIGO_MONEDA and o.codigo_grupo_producto_rar=P_CODIGO_GRUPO_PRODUCTO and
        o.codigo_monto_rar=P_CODIGO_MONTO and o.valor_cliente_rar=P_VALOR_CLIENTE and o.score_vinculado_rar=P_SCORE_VINCULADO and
        o.codigo_plazo_rar is null
        order by tea_final) t) t where t.fila=POSICION;
        select t.tea_final into LF from( select t.tea_final, rownum fila from(select tea_final from sol_operacion o 
        inner join sol_solicitud s on s.id=o.solicitud
        inner join sol_tipo_banca t on t.id=s.tipo_banca
        where t.codigo='BEC' and o.concretado_directo=1 and
        o.codigo_moneda_rar=P_CODIGO_MONEDA and o.codigo_grupo_producto_rar=P_CODIGO_GRUPO_PRODUCTO and
        o.codigo_monto_rar=P_CODIGO_MONTO and o.valor_cliente_rar=P_VALOR_CLIENTE and o.score_vinculado_rar=P_SCORE_VINCULADO and
        o.codigo_plazo_rar is null
        order by tea_final) t) t where t.fila=(POSICION+1);
        P_CUARTIL_2:=LI+(2*(LF-LI)/4);
      end if;
      RESTO:=Mod((3*(N+1)),4);
      if RESTO=0 then
        POSICION:=(3*(N+1))/4;
        select t.tea_final into P_CUARTIL_3 from( select t.tea_final, rownum fila from(select tea_final from sol_operacion o 
        inner join sol_solicitud s on s.id=o.solicitud
        inner join sol_tipo_banca t on t.id=s.tipo_banca
        where t.codigo='BEC' and o.concretado_directo=1 and
        o.codigo_moneda_rar=P_CODIGO_MONEDA and o.codigo_grupo_producto_rar=P_CODIGO_GRUPO_PRODUCTO and
        o.codigo_monto_rar=P_CODIGO_MONTO and o.valor_cliente_rar=P_VALOR_CLIENTE and o.score_vinculado_rar=P_SCORE_VINCULADO and
        o.codigo_plazo_rar is null
        order by tea_final) t) t where t.fila=POSICION;
      else
        POSICION:=((3*(N+1))-RESTO)/4;
        select t.tea_final into LI from( select t.tea_final, rownum fila from(select tea_final from sol_operacion o 
        inner join sol_solicitud s on s.id=o.solicitud
        inner join sol_tipo_banca t on t.id=s.tipo_banca
        where t.codigo='BEC' and o.concretado_directo=1 and
        o.codigo_moneda_rar=P_CODIGO_MONEDA and o.codigo_grupo_producto_rar=P_CODIGO_GRUPO_PRODUCTO and
        o.codigo_monto_rar=P_CODIGO_MONTO and o.valor_cliente_rar=P_VALOR_CLIENTE and o.score_vinculado_rar=P_SCORE_VINCULADO and
        o.codigo_plazo_rar is null
        order by tea_final) t) t where t.fila=POSICION;
        select t.tea_final into LF from( select t.tea_final, rownum fila from(select tea_final from sol_operacion o 
        inner join sol_solicitud s on s.id=o.solicitud
        inner join sol_tipo_banca t on t.id=s.tipo_banca
        where t.codigo='BEC' and o.concretado_directo=1 and
        o.codigo_moneda_rar=P_CODIGO_MONEDA and o.codigo_grupo_producto_rar=P_CODIGO_GRUPO_PRODUCTO and
        o.codigo_monto_rar=P_CODIGO_MONTO and o.valor_cliente_rar=P_VALOR_CLIENTE and o.score_vinculado_rar=P_SCORE_VINCULADO and
        o.codigo_plazo_rar is null
        order by tea_final) t) t where t.fila=(POSICION+1);
        P_CUARTIL_3:=LI+(3*(LF-LI)/4);
      end if;
      update cfg_rar set cuartil_1=P_CUARTIL_1, cuartil_2=P_CUARTIL_2, cuartil_3=P_CUARTIL_3, punto_optimo=P_CUARTIL_3 where estado=1 and
      CODIGO_MONEDA=P_CODIGO_MONEDA and CODIGO_GRUPO_PRODUCTO=P_CODIGO_GRUPO_PRODUCTO	and CODIGO_MONTO=P_CODIGO_MONTO and VALOR_CLIENTE=P_VALOR_CLIENTE and 
      SCORE_VINCULADO=P_SCORE_VINCULADO and CODIGO_PLAZO is null and TIPO_CARGA=P_TIPO_CARGA;
      end if;
    end if;
    if CODIGO_TIPO_CARGA='CONSUMO' then
      select count(tea_final) into N from sol_operacion o 
      inner join sol_solicitud s on s.id=o.solicitud
      inner join sol_tipo_banca t on t.id=s.tipo_banca
      inner join sol_producto p on p.id=o.producto
      inner join sol_grupo_producto g on g.id=p.grupo_producto
      where t.codigo='PAR' and g.codigo='1' and o.concretado_directo=1 and
      o.codigo_moneda_rar=P_CODIGO_MONEDA and o.codigo_grupo_producto_rar=P_CODIGO_GRUPO_PRODUCTO and
      o.codigo_monto_rar=P_CODIGO_MONTO and o.valor_cliente_rar=P_VALOR_CLIENTE and 
      o.score_vinculado_rar is null and o.codigo_plazo_rar is null
      order by tea_final;
      if N>=3 then
      RESTO:=Mod((1*(N+1)),4);
      if RESTO=0 then
        POSICION:=(1*(N+1))/4;
        select t.tea_final into P_CUARTIL_1 from( select t.tea_final, rownum fila from(select tea_final from sol_operacion o 
        inner join sol_solicitud s on s.id=o.solicitud
        inner join sol_tipo_banca t on t.id=s.tipo_banca
        inner join sol_producto p on p.id=o.producto
        inner join sol_grupo_producto g on g.id=p.grupo_producto
        where t.codigo='PAR' and g.codigo='1' and o.concretado_directo=1 and
        o.codigo_moneda_rar=P_CODIGO_MONEDA and o.codigo_grupo_producto_rar=P_CODIGO_GRUPO_PRODUCTO and
        o.codigo_monto_rar=P_CODIGO_MONTO and o.valor_cliente_rar=P_VALOR_CLIENTE and 
        o.score_vinculado_rar is null and o.codigo_plazo_rar is null
        order by tea_final) t) t where t.fila=POSICION;
      else
        POSICION:=((1*(N+1))-RESTO)/4;
        select t.tea_final into LI from( select t.tea_final, rownum fila from(select tea_final from sol_operacion o 
        inner join sol_solicitud s on s.id=o.solicitud
        inner join sol_tipo_banca t on t.id=s.tipo_banca
        inner join sol_producto p on p.id=o.producto
        inner join sol_grupo_producto g on g.id=p.grupo_producto
        where t.codigo='PAR' and g.codigo='1' and o.concretado_directo=1 and
        o.codigo_moneda_rar=P_CODIGO_MONEDA and o.codigo_grupo_producto_rar=P_CODIGO_GRUPO_PRODUCTO and
        o.codigo_monto_rar=P_CODIGO_MONTO and o.valor_cliente_rar=P_VALOR_CLIENTE and 
        o.score_vinculado_rar is null and o.codigo_plazo_rar is null
        order by tea_final) t) t where t.fila=POSICION;
        select t.tea_final into LF from( select t.tea_final, rownum fila from(select tea_final from sol_operacion o 
        inner join sol_solicitud s on s.id=o.solicitud
        inner join sol_tipo_banca t on t.id=s.tipo_banca
        inner join sol_producto p on p.id=o.producto
        inner join sol_grupo_producto g on g.id=p.grupo_producto
        where t.codigo='PAR' and g.codigo='1' and o.concretado_directo=1 and
        o.codigo_moneda_rar=P_CODIGO_MONEDA and o.codigo_grupo_producto_rar=P_CODIGO_GRUPO_PRODUCTO and
        o.codigo_monto_rar=P_CODIGO_MONTO and o.valor_cliente_rar=P_VALOR_CLIENTE and 
        o.score_vinculado_rar is null and o.codigo_plazo_rar is null
        order by tea_final) t) t where t.fila=(POSICION+1);
        P_CUARTIL_1:=LI+(1*(LF-LI)/4);
      end if;
      RESTO:=Mod((2*(N+1)),4);
      if RESTO=0 then
        POSICION:=(2*(N+1))/4;
        select t.tea_final into P_CUARTIL_2 from( select t.tea_final, rownum fila from(select tea_final from sol_operacion o 
        inner join sol_solicitud s on s.id=o.solicitud
        inner join sol_tipo_banca t on t.id=s.tipo_banca
        inner join sol_producto p on p.id=o.producto
        inner join sol_grupo_producto g on g.id=p.grupo_producto
        where t.codigo='PAR' and g.codigo='1' and o.concretado_directo=1 and
        o.codigo_moneda_rar=P_CODIGO_MONEDA and o.codigo_grupo_producto_rar=P_CODIGO_GRUPO_PRODUCTO and
        o.codigo_monto_rar=P_CODIGO_MONTO and o.valor_cliente_rar=P_VALOR_CLIENTE and 
        o.score_vinculado_rar is null and o.codigo_plazo_rar is null
        order by tea_final) t) t where t.fila=POSICION;
      else
        POSICION:=((2*(N+1))-RESTO)/4;
        select t.tea_final into LI from( select t.tea_final, rownum fila from(select tea_final from sol_operacion o 
        inner join sol_solicitud s on s.id=o.solicitud
        inner join sol_tipo_banca t on t.id=s.tipo_banca
        inner join sol_producto p on p.id=o.producto
        inner join sol_grupo_producto g on g.id=p.grupo_producto
        where t.codigo='PAR' and g.codigo='1' and o.concretado_directo=1 and
        o.codigo_moneda_rar=P_CODIGO_MONEDA and o.codigo_grupo_producto_rar=P_CODIGO_GRUPO_PRODUCTO and
        o.codigo_monto_rar=P_CODIGO_MONTO and o.valor_cliente_rar=P_VALOR_CLIENTE and 
        o.score_vinculado_rar is null and o.codigo_plazo_rar is null
        order by tea_final) t) t where t.fila=POSICION;
        select t.tea_final into LF from( select t.tea_final, rownum fila from(select tea_final from sol_operacion o 
        inner join sol_solicitud s on s.id=o.solicitud
        inner join sol_tipo_banca t on t.id=s.tipo_banca
        inner join sol_producto p on p.id=o.producto
        inner join sol_grupo_producto g on g.id=p.grupo_producto
        where t.codigo='PAR' and g.codigo='1' and o.concretado_directo=1 and
        o.codigo_moneda_rar=P_CODIGO_MONEDA and o.codigo_grupo_producto_rar=P_CODIGO_GRUPO_PRODUCTO and
        o.codigo_monto_rar=P_CODIGO_MONTO and o.valor_cliente_rar=P_VALOR_CLIENTE and 
        o.score_vinculado_rar is null and o.codigo_plazo_rar is null
        order by tea_final) t) t where t.fila=(POSICION+1);
        P_CUARTIL_2:=LI+(2*(LF-LI)/4);
      end if;
      RESTO:=Mod((3*(N+1)),4);
      if RESTO=0 then
        POSICION:=(3*(N+1))/4;
        select t.tea_final into P_CUARTIL_3 from( select t.tea_final, rownum fila from(select tea_final from sol_operacion o 
        inner join sol_solicitud s on s.id=o.solicitud
        inner join sol_tipo_banca t on t.id=s.tipo_banca
        inner join sol_producto p on p.id=o.producto
        inner join sol_grupo_producto g on g.id=p.grupo_producto
        where t.codigo='PAR' and g.codigo='1' and o.concretado_directo=1 and
        o.codigo_moneda_rar=P_CODIGO_MONEDA and o.codigo_grupo_producto_rar=P_CODIGO_GRUPO_PRODUCTO and
        o.codigo_monto_rar=P_CODIGO_MONTO and o.valor_cliente_rar=P_VALOR_CLIENTE and 
        o.score_vinculado_rar is null and o.codigo_plazo_rar is null
        order by tea_final) t) t where t.fila=POSICION;
      else
        POSICION:=((3*(N+1))-RESTO)/4;
        select t.tea_final into LI from( select t.tea_final, rownum fila from(select tea_final from sol_operacion o 
        inner join sol_solicitud s on s.id=o.solicitud
        inner join sol_tipo_banca t on t.id=s.tipo_banca
        inner join sol_producto p on p.id=o.producto
        inner join sol_grupo_producto g on g.id=p.grupo_producto
        where t.codigo='PAR' and g.codigo='1' and o.concretado_directo=1 and
        o.codigo_moneda_rar=P_CODIGO_MONEDA and o.codigo_grupo_producto_rar=P_CODIGO_GRUPO_PRODUCTO and
        o.codigo_monto_rar=P_CODIGO_MONTO and o.valor_cliente_rar=P_VALOR_CLIENTE and 
        o.score_vinculado_rar is null and o.codigo_plazo_rar is null
        order by tea_final) t) t where t.fila=POSICION;
        select t.tea_final into LF from( select t.tea_final, rownum fila from(select tea_final from sol_operacion o 
        inner join sol_solicitud s on s.id=o.solicitud
        inner join sol_tipo_banca t on t.id=s.tipo_banca
        inner join sol_producto p on p.id=o.producto
        inner join sol_grupo_producto g on g.id=p.grupo_producto
        where t.codigo='PAR' and g.codigo='1' and o.concretado_directo=1 and
        o.codigo_moneda_rar=P_CODIGO_MONEDA and o.codigo_grupo_producto_rar=P_CODIGO_GRUPO_PRODUCTO and
        o.codigo_monto_rar=P_CODIGO_MONTO and o.valor_cliente_rar=P_VALOR_CLIENTE and 
        o.score_vinculado_rar is null and o.codigo_plazo_rar is null
        order by tea_final) t) t where t.fila=(POSICION+1);
        P_CUARTIL_3:=LI+(3*(LF-LI)/4);
      end if;
      update cfg_rar set cuartil_1=P_CUARTIL_1, cuartil_2=P_CUARTIL_2, cuartil_3=P_CUARTIL_3, punto_optimo=P_CUARTIL_3 where estado=1 and
      CODIGO_MONEDA=P_CODIGO_MONEDA and CODIGO_GRUPO_PRODUCTO=P_CODIGO_GRUPO_PRODUCTO	and CODIGO_MONTO=P_CODIGO_MONTO and VALOR_CLIENTE=P_VALOR_CLIENTE and 
      SCORE_VINCULADO is null and CODIGO_PLAZO is null and TIPO_CARGA=P_TIPO_CARGA;
      end if;
    end if;
    if CODIGO_TIPO_CARGA='HIPOTECARIO' then
      select count(tea_final) into N from sol_operacion o 
      inner join sol_solicitud s on s.id=o.solicitud
      inner join sol_tipo_banca t on t.id=s.tipo_banca
      inner join sol_producto p on p.id=o.producto
      inner join sol_grupo_producto g on g.id=p.grupo_producto
      where t.codigo='PAR' and g.codigo='2' and o.concretado_directo=1 and
      o.codigo_moneda_rar=P_CODIGO_MONEDA and o.codigo_grupo_producto_rar=P_CODIGO_GRUPO_PRODUCTO and
      o.codigo_monto_rar=P_CODIGO_MONTO and o.valor_cliente_rar=P_VALOR_CLIENTE and 
      o.score_vinculado_rar is null and o.codigo_plazo_rar=P_CODIGO_PLAZO
      order by tea_final;
      if N>=3 then 
      RESTO:=Mod((1*(N+1)),4);
      if RESTO=0 then
        POSICION:=(1*(N+1))/4;
        select t.tea_final into P_CUARTIL_1 from( select t.tea_final, rownum fila from(select tea_final from sol_operacion o 
        inner join sol_solicitud s on s.id=o.solicitud
        inner join sol_tipo_banca t on t.id=s.tipo_banca
        inner join sol_producto p on p.id=o.producto
        inner join sol_grupo_producto g on g.id=p.grupo_producto
        where t.codigo='PAR' and g.codigo='2' and o.concretado_directo=1 and
        o.codigo_moneda_rar=P_CODIGO_MONEDA and o.codigo_grupo_producto_rar=P_CODIGO_GRUPO_PRODUCTO and
        o.codigo_monto_rar=P_CODIGO_MONTO and o.valor_cliente_rar=P_VALOR_CLIENTE and 
        o.score_vinculado_rar is null and o.codigo_plazo_rar=P_CODIGO_PLAZO
        order by tea_final) t) t where t.fila=POSICION;
      else
        POSICION:=((1*(N+1))-RESTO)/4;
        select t.tea_final into LI from( select t.tea_final, rownum fila from(select tea_final from sol_operacion o 
        inner join sol_solicitud s on s.id=o.solicitud
        inner join sol_tipo_banca t on t.id=s.tipo_banca
        inner join sol_producto p on p.id=o.producto
        inner join sol_grupo_producto g on g.id=p.grupo_producto
        where t.codigo='PAR' and g.codigo='2' and o.concretado_directo=1 and
        o.codigo_moneda_rar=P_CODIGO_MONEDA and o.codigo_grupo_producto_rar=P_CODIGO_GRUPO_PRODUCTO and
        o.codigo_monto_rar=P_CODIGO_MONTO and o.valor_cliente_rar=P_VALOR_CLIENTE and 
        o.score_vinculado_rar is null and o.codigo_plazo_rar=P_CODIGO_PLAZO
        order by tea_final) t) t where t.fila=POSICION;
        select t.tea_final into LF from( select t.tea_final, rownum fila from(select tea_final from sol_operacion o 
        inner join sol_solicitud s on s.id=o.solicitud
        inner join sol_tipo_banca t on t.id=s.tipo_banca
        inner join sol_producto p on p.id=o.producto
        inner join sol_grupo_producto g on g.id=p.grupo_producto
        where t.codigo='PAR' and g.codigo='2' and o.concretado_directo=1 and
        o.codigo_moneda_rar=P_CODIGO_MONEDA and o.codigo_grupo_producto_rar=P_CODIGO_GRUPO_PRODUCTO and
        o.codigo_monto_rar=P_CODIGO_MONTO and o.valor_cliente_rar=P_VALOR_CLIENTE and 
        o.score_vinculado_rar is null and o.codigo_plazo_rar=P_CODIGO_PLAZO
        order by tea_final) t) t where t.fila=(POSICION+1);
        P_CUARTIL_1:=LI+(1*(LF-LI)/4);
      end if;
      RESTO:=Mod((2*(N+1)),4);
      if RESTO=0 then
        POSICION:=(2*(N+1))/4;
        select t.tea_final into P_CUARTIL_2 from( select t.tea_final, rownum fila from(select tea_final from sol_operacion o 
        inner join sol_solicitud s on s.id=o.solicitud
        inner join sol_tipo_banca t on t.id=s.tipo_banca
        inner join sol_producto p on p.id=o.producto
        inner join sol_grupo_producto g on g.id=p.grupo_producto
        where t.codigo='PAR' and g.codigo='2' and o.concretado_directo=1 and
        o.codigo_moneda_rar=P_CODIGO_MONEDA and o.codigo_grupo_producto_rar=P_CODIGO_GRUPO_PRODUCTO and
        o.codigo_monto_rar=P_CODIGO_MONTO and o.valor_cliente_rar=P_VALOR_CLIENTE and 
        o.score_vinculado_rar is null and o.codigo_plazo_rar=P_CODIGO_PLAZO
        order by tea_final) t) t where t.fila=POSICION;
      else
        POSICION:=((2*(N+1))-RESTO)/4;
        select t.tea_final into LI from( select t.tea_final, rownum fila from(select tea_final from sol_operacion o 
        inner join sol_solicitud s on s.id=o.solicitud
        inner join sol_tipo_banca t on t.id=s.tipo_banca
        inner join sol_producto p on p.id=o.producto
        inner join sol_grupo_producto g on g.id=p.grupo_producto
        where t.codigo='PAR' and g.codigo='2' and o.concretado_directo=1 and
        o.codigo_moneda_rar=P_CODIGO_MONEDA and o.codigo_grupo_producto_rar=P_CODIGO_GRUPO_PRODUCTO and
        o.codigo_monto_rar=P_CODIGO_MONTO and o.valor_cliente_rar=P_VALOR_CLIENTE and 
        o.score_vinculado_rar is null and o.codigo_plazo_rar=P_CODIGO_PLAZO
        order by tea_final) t) t where t.fila=POSICION;
        select t.tea_final into LF from( select t.tea_final, rownum fila from(select tea_final from sol_operacion o 
        inner join sol_solicitud s on s.id=o.solicitud
        inner join sol_tipo_banca t on t.id=s.tipo_banca
        inner join sol_producto p on p.id=o.producto
        inner join sol_grupo_producto g on g.id=p.grupo_producto
        where t.codigo='PAR' and g.codigo='2' and o.concretado_directo=1 and
        o.codigo_moneda_rar=P_CODIGO_MONEDA and o.codigo_grupo_producto_rar=P_CODIGO_GRUPO_PRODUCTO and
        o.codigo_monto_rar=P_CODIGO_MONTO and o.valor_cliente_rar=P_VALOR_CLIENTE and 
        o.score_vinculado_rar is null and o.codigo_plazo_rar=P_CODIGO_PLAZO
        order by tea_final) t) t where t.fila=(POSICION+1);
        P_CUARTIL_2:=LI+(2*(LF-LI)/4);
      end if;
      RESTO:=Mod((3*(N+1)),4);
      if RESTO=0 then
        POSICION:=(3*(N+1))/4;
        select t.tea_final into P_CUARTIL_3 from( select t.tea_final, rownum fila from(select tea_final from sol_operacion o 
        inner join sol_solicitud s on s.id=o.solicitud
        inner join sol_tipo_banca t on t.id=s.tipo_banca
        inner join sol_producto p on p.id=o.producto
        inner join sol_grupo_producto g on g.id=p.grupo_producto
        where t.codigo='PAR' and g.codigo='2' and o.concretado_directo=1 and
        o.codigo_moneda_rar=P_CODIGO_MONEDA and o.codigo_grupo_producto_rar=P_CODIGO_GRUPO_PRODUCTO and
        o.codigo_monto_rar=P_CODIGO_MONTO and o.valor_cliente_rar=P_VALOR_CLIENTE and 
        o.score_vinculado_rar is null and o.codigo_plazo_rar=P_CODIGO_PLAZO
        order by tea_final) t) t where t.fila=POSICION;
      else
        POSICION:=((3*(N+1))-RESTO)/4;
        select t.tea_final into LI from( select t.tea_final, rownum fila from(select tea_final from sol_operacion o 
        inner join sol_solicitud s on s.id=o.solicitud
        inner join sol_tipo_banca t on t.id=s.tipo_banca
        inner join sol_producto p on p.id=o.producto
        inner join sol_grupo_producto g on g.id=p.grupo_producto
        where t.codigo='PAR' and g.codigo='2' and o.concretado_directo=1 and
        o.codigo_moneda_rar=P_CODIGO_MONEDA and o.codigo_grupo_producto_rar=P_CODIGO_GRUPO_PRODUCTO and
        o.codigo_monto_rar=P_CODIGO_MONTO and o.valor_cliente_rar=P_VALOR_CLIENTE and 
        o.score_vinculado_rar is null and o.codigo_plazo_rar=P_CODIGO_PLAZO
        order by tea_final) t) t where t.fila=POSICION;
        select t.tea_final into LF from( select t.tea_final, rownum fila from(select tea_final from sol_operacion o 
        inner join sol_solicitud s on s.id=o.solicitud
        inner join sol_tipo_banca t on t.id=s.tipo_banca
        inner join sol_producto p on p.id=o.producto
        inner join sol_grupo_producto g on g.id=p.grupo_producto
        where t.codigo='PAR' and g.codigo='2' and o.concretado_directo=1 and
        o.codigo_moneda_rar=P_CODIGO_MONEDA and o.codigo_grupo_producto_rar=P_CODIGO_GRUPO_PRODUCTO and
        o.codigo_monto_rar=P_CODIGO_MONTO and o.valor_cliente_rar=P_VALOR_CLIENTE and 
        o.score_vinculado_rar is null and o.codigo_plazo_rar=P_CODIGO_PLAZO
        order by tea_final) t) t where t.fila=(POSICION+1);
        P_CUARTIL_3:=LI+(3*(LF-LI)/4);
      end if;
      update cfg_rar set cuartil_1=P_CUARTIL_1, cuartil_2=P_CUARTIL_2, cuartil_3=P_CUARTIL_3, punto_optimo=P_CUARTIL_3 where estado=1 and
      CODIGO_MONEDA=P_CODIGO_MONEDA and CODIGO_GRUPO_PRODUCTO=P_CODIGO_GRUPO_PRODUCTO	and CODIGO_MONTO=P_CODIGO_MONTO and VALOR_CLIENTE=P_VALOR_CLIENTE and 
      SCORE_VINCULADO is null and CODIGO_PLAZO=P_CODIGO_PLAZO and TIPO_CARGA=P_TIPO_CARGA;
      end if;
    end if;
  END;
END;

END PK_CARGA_ARCHIVO;